enum Direction {
  NORTH,
  SOUTH,
  EAST,
  WEST
}

// 枚举默认是按照数字输出，这里 NORTH 输出 0,
// SOUTH 输出 1, 依次类推
let dir: Direction = Direction.SOUTH;

console.log(dir);

// 也可以设置初始值

enum Direction1 {
  NORTH = 3,
  SOUTH,
  EAST,
  WEST,
}

// 设置初始值之后，后面的数值会紧跟第一个初始值
// 这里 SOUTH 会输出 4, 依次类推
let dir1: Direction1 = Direction1.NORTH;
let dir2: Direction1 = Direction1.SOUTH;

console.log(dir1);
console.log(dir2);

// // 也可以设置字符串枚举
// // 但字符串枚举不允许空值，否则会报错
// enum Direction2 {
//   NORTH = "NORTH",
//   SOUTH = "SOUTH",
//   EAST = "EAST",
//   WEST,
// }

// // 强行输出会输出 undefined
// let dir3: Direction2 = Direction2.WEST;

// console.log(dir3);

enum Direction3 {
  NORTH = "NORTH",
  SOUTH = "SOUTH",
  EAST = "EAST",
  WEST = "WEST",
}

let dir4: Direction3 = Direction3.WEST;

console.log(dir4);

// 异构枚举，成员值是数字和字符串的混合
// 所有未给予初始值的属性都会根据数字给予初始值
// 例如，A和B分别是 0 和 1, 而 F 是 9, 因为它在 8 的后面
// 联系这一点，可以知道字符串后面的属性报错的原因
// （它不知道自己的数字应该是什么）

enum Enum {
  A,
  B,
  C = "C",
  D = "D",
  E = 8,
  F,
}

let e1: Enum = Enum.A;
let e2: Enum = Enum.F; 
console.log(e1, e2);